package com.lg.algorithm.collections.queue.block;

import lombok.SneakyThrows;

import java.util.concurrent.*;

/**
 * 开始多大
 * 开始必须指定大小
 *
 * 是否可以扩容
 * 后期不能扩容，开始指定大小
 *
 * 如何保证线程安全
 * ReentrantLock
 *
 * 增加的时候会被阻塞
 * 超过容量在向队列put 会被阻塞
 *
 * 往外拿的时候也会被阻塞
 * 队列中没有数据的时候，再take 会被阻塞
 *
 * 他们的原理是怎样的
 * 初始化的时候会 new一个指定大小的数组，并有初始化两个lock.newCondition()
 * 增加元素，向数组中增加元素，notEmpty.singal 当数组满的时候 notFull.await()
 * 移除元素notFull.signal();
 *
 * 阻塞线程会被挂起么
 * 会 LockSupport.park(this);
 * 阻塞会释放锁资源么
 * 会 LockSupport.park(this);
 */
public class ArrayBlockingQueueTest {
    @SneakyThrows
    public static void main(String[] args) {
        ArrayBlockingQueue<Integer> integers1 = new ArrayBlockingQueue<Integer>(1);

        /**
         * 失败抛出异常
         *      add  remove element
         *          element 看一看但不拿出来
         */
        System.out.println("======抛出异常======");
        boolean add1 = integers1.add(1);
        integers1.put(1);
        integers1.put(1);
//        boolean add11 = integers1.add(1);
        System.out.println(integers1.element());
        System.out.println(integers1.size());
        integers1.remove(1);
        System.out.println(integers1.size());

        /**
         *  特殊返回
         *      offer   poll    peek
         */
        System.out.println("======特殊返回======");
        integers1.offer(1);
        integers1.peek();
        integers1.poll();

        System.out.println("======超时返回======");
        integers1.offer(1, 1, TimeUnit.SECONDS);
        integers1.poll(1, TimeUnit.SECONDS);

        System.out.println("======阻塞======");
        integers1.put(1);
        integers1.put(1);
        integers1.put(1);
        integers1.take();
    }
}
